package com.newlink.building.main.ui

import android.content.Intent
import android.util.SparseArray
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.viewpager2.widget.ViewPager2 // Still imported for future use, but not actively used
import com.google.android.material.snackbar.Snackbar
import com.newlink.building.common_base.base.NL_BaseMvpActivity
import com.newlink.building.common_base.model.bean.PropertyManagerData // Not used directly in UI logic here
import com.newlink.building.common_base.model.bean.RoomData // Not used directly in UI logic here
import com.newlink.building.common_base.model.bean.UnitData
import com.newlink.building.common_base.model.bean.UnitTabData
import com.newlink.building.common_base.utils.NLog
import com.newlink.building.main.R
import com.newlink.building.main.adapter.Module_Main_UnitTabAdapter
import com.newlink.building.main.adapter.Module_Main_ViewPage2FragmentAdapter // Still imported for future use
import com.newlink.building.main.databinding.ActivityResidentLayoutBinding
import com.newlink.building.main.fragment.CategorySecondFragment
import com.newlink.building.main.mvp.contract.Module_Main_ResidentContract
import com.newlink.building.main.mvp.presenter.Module_Main_ResidentPresenter
import com.newlink.building.NL_App.Companion.coreContext
import com.newlink.building.common_base.utils.logInfo
import com.newlink.building.ext.gone
import com.newlink.building.ext.visible

/**
 * @Author: Jake (Refactored by Assistant)
 * @Date: 2024-10-15
 * @Description: 居民主界面。该界面显示不同类型的单元（如物业管理员、房屋单元等）作为可切换的标签，
 * 并根据选中的标签加载相应的Fragment内容。同时提供搜索功能和呼叫错误消息提示。
 */
class Module_Main_ResidentActivityNL : NL_BaseMvpActivity<Module_Main_ResidentContract.View, Module_Main_ResidentContract.Presenter>(),
    Module_Main_ResidentContract.View {

    // MVP Presenter 的创建
    override fun createPresenter(): Module_Main_ResidentContract.Presenter = Module_Main_ResidentPresenter()

    // View Binding 实例
    private lateinit var binding: ActivityResidentLayoutBinding

    // 单元标签适配器
    private var unitTabAdapter: Module_Main_UnitTabAdapter? = null

    // ViewPager2 适配器 (当前未激活使用，但保留以备未来扩展)
    private var viewPagerAdapter: Module_Main_ViewPage2FragmentAdapter? = null

    // Fragment 缓存 (当前主要通过 FragmentTransaction 替换，此缓存用途有限)
    private var contentFragments = SparseArray<Fragment>()

    // 单元标签数据列表
    private var unitTabItems = mutableListOf<UnitTabData>()

    // 当前选中的标签位置
    private var currentSelectedTabPosition = 0

    /**
     * 绑定布局文件并返回根视图。
     * @return Activity 的根视图。
     */
    override fun attachLayoutRes(): View {
        binding = ActivityResidentLayoutBinding.inflate(layoutInflater)
        return binding.root
    }

    /**
     * 初始化数据。从 Intent 中获取项目ID，显示加载状态，并请求单元列表数据。
     */
    override fun initData() {
        projectId = intent?.getStringExtra("mPrjId").orEmpty()
        showLoading() // 显示加载动画或提示
        mPresenter?.getUnitList(accessToken, projectId, "") // 调用Presenter获取单元列表
    }

    /**
     * 初始化视图组件和设置监听器。
     */
    override fun initView() {
        super.initView()
        // 设置标题栏文本
        binding.titleBar.tvTitleBarCenter.text = getString(R.string.resident_str)

        setupTabRecyclerView() // 初始化标签RecyclerView
        setupClickListeners() // 设置所有点击监听器
        setupCallErrorMessageObserver() // 初始化呼叫错误消息观察者

        // initViewPager2() // 如果未来需要使用ViewPager2，则取消注释此行
    }

    /**
     * 设置所有可点击视图的监听器。
     */
    private fun setupClickListeners() {
        // 居民搜索布局点击监听
        binding.residentSearchLayout.setOnClickListener {
            startActivity(Intent(this, Module_Main_ResidentSearchActivityNL::class.java))
        }
    }

    /**
     * 初始化标签 RecyclerView。
     */
    private fun setupTabRecyclerView() {
        unitTabAdapter = Module_Main_UnitTabAdapter(this).apply {
            onItemClickListener = { _, position ->
                updateTabSelection(position)
                // 如果使用 ViewPager2: binding.viewPager2.setCurrentItem(position, false)
            }
        }
        binding.tabRecyclerView.apply {
            layoutManager = LinearLayoutManager(this@Module_Main_ResidentActivityNL)
            adapter = unitTabAdapter
        }
    }

    /**
     * 更新标签选中状态并显示对应内容 Fragment。
     * @param position 新选中的标签位置。
     */
    private fun updateTabSelection(position: Int) {
        // 避免重复点击同一位置
        if (currentSelectedTabPosition == position) {
            return
        }

        // 更新上一条Item的选中状态
        unitTabAdapter?.getItem(currentSelectedTabPosition)?.let { oldItem ->
            if (oldItem is UnitTabData) {
                oldItem.isSelected = false
                // 更高效的更新方式: unitTabAdapter?.notifyItemChanged(currentSelectedTabPosition)
            }
        }

        // 更新当前Item的选中状态
        unitTabAdapter?.getItem(position)?.let { newItem ->
            if (newItem is UnitTabData) {
                newItem.isSelected = true
                // 更高效的更新方式: unitTabAdapter?.notifyItemChanged(position)
            }
        }

        // 显示对应的Fragment内容
        showContentFragment(position)

        // 更新当前选中位置
        currentSelectedTabPosition = position
        unitTabAdapter?.notifyDataSetChanged() // 刷新整个适配器（如果需要更高效，请使用 notifyItemChanged）
        binding.tabRecyclerView.smoothScrollToPosition(position) // 平滑滚动到选中位置
    }

    /**
     * 初始化 ViewPager2 (当前未激活使用，但保留以备未来扩展)。
     */
    @Suppress("unused") // Suppress unused warning since it's commented out in initView
    private fun initViewPager2() {
        viewPagerAdapter = Module_Main_ViewPage2FragmentAdapter(this, contentFragments)

        binding.viewPager2.apply {
            offscreenPageLimit = ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT
            orientation = ViewPager2.ORIENTATION_VERTICAL
            registerOnPageChangeCallback(viewPager2Callback)
            adapter = viewPagerAdapter
        }
    }

    /**
     * ViewPager2 页面切换回调 (当前未激活使用)。
     */
    @Suppress("unused") // Suppress unused warning since initViewPager2 is commented out
    private val viewPager2Callback = object : ViewPager2.OnPageChangeCallback() {
        override fun onPageSelected(position: Int) {
            updateTabSelection(position)
        }
    }

    /**
     * 获取单元列表成功时的回调。
     * @param data 单元数据列表。
     */
    override fun getUnitListSuccess(data: MutableList<UnitData>) {
        hideLoading() // 隐藏加载状态
        unitTabItems.clear() // 清除旧数据

        // 添加物业管理员标签
        unitTabItems.add(
            0,
            UnitTabData(tabName = getString(R.string.property_manager), type = 1, prjId = projectId)
        )

        // 添加获取到的单元数据
        if (data.isNotEmpty()) {
            unitTabItems.addAll(data)
            binding.viewEmptyData.gone() // 有数据时隐藏空数据视图
        } else {
            // 无单元数据时，空数据视图应可见，但考虑到物业管理员始终存在，这里逻辑可能需要微调
            // 原始代码只在 showDefaultMsg 或 showEmpty() 中显示空视图
        }

        unitTabAdapter?.setData(unitTabItems) // 设置适配器数据
        unitTabItems.firstOrNull()?.isSelected = true // 默认选中第一个标签 (物业管理员)

        showContentFragment(0) // 显示第一个标签对应的Fragment内容
        currentSelectedTabPosition = 0 // 更新当前选中位置
    }

    /**
     * 获取房间列表成功时的回调 (当前未实现具体逻辑)。
     * @param data 房间数据列表。
     */
    override fun getRoomListSuccess(data: MutableList<RoomData>) {
        // TODO: Handle room list data if needed
    }

    /**
     * 获取物业用户列表成功时的回调 (当前未实现具体逻辑)。
     * @param data 物业管理员数据列表。
     */
    override fun getPropertyUserListSuccess(data: MutableList<PropertyManagerData>) {
        // TODO: Handle property user list data if needed
    }

    /**
     * 显示对应标签的 Fragment 内容。
     * @param position 选中的标签位置。
     */
    private fun showContentFragment(position: Int) {
        if (position < 0 || position >= unitTabItems.size) {
            logInfo<Module_Main_ResidentActivityNL>(">> showContentFragment >> Invalid position: $position")
            return
        }

        val unitTabItem = unitTabItems[position]
        // 确保传递正确的 UnitData 或 PropertyManagerData (根据 unitTabItem.type)
        val fragment = CategorySecondFragment.newInstance(unitTabItem)

        val transaction: FragmentTransaction = supportFragmentManager.beginTransaction()
        transaction.replace(R.id.contentFrameLayout, fragment) // 替换 Fragment
        transaction.commit() // 提交事务
    }

    /**
     * 显示默认消息（通常用于错误或空状态）。
     * @param msg 要显示的消息。
     */
    override fun showDefaultMsg(msg: String) {
        super.showDefaultMsg(msg)
        NLog.e("[ResidentActivity] >> showDefaultMsg >> $msg")
        binding.viewEmptyData.visible() // 显示空数据视图
    }

    /**
     * 初始化呼叫错误消息的观察者。
     * 观察来自 Linphone 核心的错误消息并显示 Snackbar。
     */
    private fun setupCallErrorMessageObserver() {
        coreContext.callErrorMessageResourceId.observe(this) { event ->
            event.consume { message ->
                showSnackBar(message) // 显示 Snackbar 消息
            }
        }
    }

    /**
     * 显示 Snackbar 消息。
     * @param message 要显示的消息。
     */
    override fun showSnackBar(message: String) {
        Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG).show()
    }

    //region 原始代码中被注释掉的加载/空状态视图方法，已移除
    // private fun playLoading() { ... }
    // private fun showSuccess() { ... }
    // private fun showEmpty() { ... }
    //endregion
}